#include<bits/stdc++.h>
using namespace std;
const int N=2009;
int r,c,n,x1,y11,x2,y2;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
string str[N];
/*struct node{
    int x,y,tp;
};
struct rest{
    int restx,resty;
};
map<node,rest> mp;
map<node,int> dis;
void bfs(){
    node now,nxt;
    int x,y,tp,nx,ny,ntp;
    int rx,ry;
    list<node> que;
    if(str[x1][y1]=='.'){
        now=(node){x1,y1,0};
        que.push_back(now);
        dis[now]=0;
        mp[now]=(rest){0,0};
    }
    else{
        now=(node){x1,y1,1};
        que.push_back(now);
        dis[now]=1;
        mp[now]=(rest){n-1,n-1};
        now=(node){x1,y1,2};
        que.push_back(now);
        dis[now]=1;
        mp[now]=(rest){n-1,n-1};
    }
    while(!que.empty()){
        now=que.front(); que.pop_front();
        x=now.x; y=now.y; tp=now.tp;
        rx=mp[node].restx; ry=mp[node].resty;
        if(tp==0){
            for(int i=0;i<=3;i++){
                nx=x+dx[i]; ny=y+dy[i];
                if(nx<1||nx>r||ny<1||ny>c) continue;
                if(str[nx][ny]=='.'){
                    nxt=(node){nx,ny,0};
                    que.push_front(nxt);
                }
                else{

                }
            }
        }
        else{

        }
    }
    return;
}*/
int dis[1009][1009],vis[1009][1009];
struct node{
    int x,y;
};
list<node> que;
void insert(int x,int y){
    for(int i=max(x-n+1,0);i<=min(x+n-1,r);i++)
        for(int j=max(y-n,0);j<=min(y+n,c);j++)
            if(dis[i][j]>dis[x][y]+1){
                dis[i][j]=dis[x][y]+1;
                que.push_back((node){i,j});               
            }
    for(int i=max(x-n,0);i<=min(x+n,r);i++)
        for(int j=max(y-n+1,0);j<=min(y+n-1,c);j++)
            if(dis[i][j]>dis[x][y]+1){
                dis[i][j]=dis[x][y]+1;
                que.push_back((node){i,j});
            }
    return;
}
void bfs(){
    memset(dis,0x3f,sizeof(dis));
    if(str[x1][y11]=='.'){
        que.push_back((node){x1,y11});
        dis[x1][y11]=0;
    }
    else{
        for(int i=max(0,x1-n+1);i<=min(r,x1+n-1);i++)
            for(int j=max(0,y11-n+1);j<=min(c,y11+n-1);j++)
                dis[i][j]=1,que.push_back((node){i,j});
    }
    node now;
    int x,y,nx,ny;
    while(!que.empty()){
        now=que.front(); que.pop_front();
        x=now.x; y=now.y;
        if(vis[x][y]) continue;
        vis[x][y]=1;
        for(int i=0;i<=3;i++){
            nx=x+dx[i]; ny=y+dy[i];
            if(nx<1||nx>r||ny<1||ny>c||str[nx][ny]!='.'||dis[nx][ny]<=dis[x][y]) continue;
            dis[nx][ny]=dis[x][y]; que.push_front((node){nx,ny});
        }
        insert(x,y);
    }
    return;
}
int main(){
    freopen("stamp.in","r",stdin);
    freopen("stamp.out","w",stdout);
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>r>>c>>n;
    cin>>x1>>y11>>x2>>y2;
    for(int i=1;i<=r;i++)
        cin>>str[i],str[i]=" "+str[i];
    bfs();
    cout<<dis[x2][y2];
    return 0;
}